#include <stdio.h>
#include <stdlib.h>/*该文件包含exit()等函数*/
#define QUEUE_MAX_SIZE 100 // 栈最多支持存放100个数据元素

typedef struct Queue {
    int elements[QUEUE_MAX_SIZE];
    int size;
} Queue;

// 初始化队列。初始化成功返回0；初始化失败返回1。
int init_queue(Queue ** q){
    *q = (Queue *)malloc(sizeof(Queue));
    (*q)->size = NULL;

    if(!(*q)->size)
        return 1;
    else
        return 0;
}

// 在队列q的尾巴上增加一个元素，其值为value。增加成功，返回0；增加失败，返回1
int enqueue (Queue * q, int value){

    if(q->size>QUEUE_MAX_SIZE)// 队列满，增加失败
        return 1;
    q->elements[q->size]=value;
    q->size++;
    return 0;
}

// 从队列q上摘取（去掉）一个元素，将其值放入value中。摘取成功，返回0；摘取失败，返回1。
int dequeue(Queue * q, int *value){
    // 队列为空，摘取失败
    if(q->size<=0)
        return 1;
    // 将其值放入value中
    *value=q->elements[0];
    for (int i = 0; i < q->size-1; ++i) {
        q->elements[i] = q->elements[i+1];
    }
    q->size--;
    return 0;
}

// 获取队列q的第一个元素，但是并不去掉该元素，并将该值放入value中。获取成功返回0；获取失败，返回1。
int first(Queue * q, int * value){
    // 判断队列是否为空
    if((q->size)<=0)
        return 1;
    // 并将该值放入value中
    *value = q->elements[q->size];
    return 0;
}

// 判断队列q是否为空。为空，返回0；不为空，返回1。
int is_empty(Queue * q){
    if(q->size<=0)
        return 0;
    else
        return 1;
}

// 返回队列q中的元素个数。
int size(Queue * q){
    return q->size;
}


int main() {
    Queue* q = 0;
    int value = 0;
    init_queue(&q);
    for (int a = 0; a < 100; a++) {
        enqueue(q, a);
    }
    first(q, &value);
    printf("the first num: %d\n",value);
    dequeue(q, &value);
    printf("Out of queue: %d\n",value);
    dequeue(q, &value);
    printf("Out of queue: %d\n",value);
    dequeue(q, &value);
    printf("Out of queue: %d\n",value);
    printf("Is the queue empty: %d\n", is_empty(q));
    printf("size of queue: %d\n", size(q));
    return 0;
}